当前位置:  开发笔记 > 编程语言 > 正文

将非`void`指针转换为`uintptr_t`,反之亦然

如何解决《将非`void`指针转换为`uintptr_t`,反之亦然》经验,为你挑选了1个好方法。

有两个相关的C标准规则:

C99标准,6.3.2.3:

指向void的指针可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针.

而且7.20.1.4:

以下类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针: uintptr_t

这意味着,以下代码符合:

int *p = NULL;
void *q = (void*)p;
uintptr_t s = (uintptr_t)q;

但它真的需要两步演员吗?如果执行以下操作,编译器是否会执行隐式中间转换:

int *p = NULL;
uintptr_t s = (uintptr_t)p;

(好吧,它可能会出现在大多数编译器上,但我的问题是关于标准符合性)



1> Bathsheba..:

我不会冒险.该标准清楚地表明了允许的内容和不允许的内容.

uintptr_t s = (uintptr_t)(void*)p;向你的代码的读者写信,你知道你在做什么.


老实说,如果我看到那段代码,我会怀疑作者是否知道他们在做什么.部分原因是我不会完全记录手头标准的相关段落.我并不是说用这种方式写它是错误的,但它也不会让我感到明显正确.
在这种情况下,撰写评论不会有任何损害.取决于您的房屋政策.
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有